#include <iostream>
#include "../CImg/CImg.h"
using namespace std;
using namespace cimg_library;


/*
 * Devuelve el perfil de una imagen en el segmento dado por (x0,y0) y (x1,y1); 
 */
CImg<unsigned char> perfilDesdeSegmento(CImg<unsigned char> &img, unsigned x0, unsigned y0, unsigned x1, unsigned y1){
	// acomoda el orden de las coordenadas
	if(x0>x1) {unsigned temp=x1; x1=x0; x0=temp;}
	if(y0>y1) {unsigned temp=y1; y1=y0; y0=temp;}
	CImg<unsigned char> perfil;
	
	
	// buscamos el lado mas largo y rasterizamos en ese lado
	float pendiente; unsigned ladoLargo;
	if(x1-x0>y1-y0){
		ladoLargo=x1-x0;
		pendiente=float(y1-y0)/ladoLargo;
		perfil.assign(ladoLargo, 1);
		for(unsigned i=x0, j=0; i<x1; i++, j++){
			perfil(j, 0)=img(i, y0+round((i-x0)*pendiente));
		}
	}else{
		ladoLargo=y1-y0;
		pendiente=float(x1-x0)/ladoLargo;
		perfil.assign(ladoLargo, 1);
		for(unsigned i=y0, j=0; i<y1; i++, j++){
			perfil(j, 0)=img(x0+round((i-y0)*pendiente), i);
		}
	}
	return perfil;
}




int main(int argc, char *argv[]) {
	// la imagen, el perfil de intensidad de la fila, el de la columna y el del segmento
	CImg<unsigned char> img, imgDisplay, fila, columna, segmento; 
	CImgDisplay displayImagen, displayGrafico;
	segmento.assign(1,1); // construimos un perfil para que no este vacio
	
	// cargamos la imagen
	img.load("../img_test/huang2.jpg");	
	CImg<unsigned char> grafico(600, 300,1, 3);	// imagen donde renderizamos el grafico
	displayImagen.assign(img);
	displayGrafico.assign(grafico, "Perfiles de intensidad");

	unsigned x, y; // x e y del raton
	unsigned x0, y0, x1, y1; // coordenadas del segmeto
	bool dibujarRecta=false, dragging=false;
	
	// colores para graficar
	unsigned char rojo[]={255, 0, 0};	
	unsigned char verde[]={0, 255, 0};
	unsigned char azul[]={0, 0, 255};
	unsigned char blanco[]={255, 255, 255};
	
	while(!displayImagen.is_closed()){
		displayImagen.wait(); // esperamos algun evento
		x=displayImagen.mouse_x();
		y=displayImagen.mouse_y();
		
		// controla los clicks del raton
		if(displayImagen.button() && !dragging){
			dragging=true;
			dibujarRecta=false;
			x0=x; y0=y; 
		}
		else if(!displayImagen.button() && dragging){
			dragging=false; x1=x; y1=y;
			dibujarRecta=true;
			segmento=perfilDesdeSegmento(img, x0, y0, x1, y1);
		}
		
		// saca las subimagenes de la fila y columna
		fila=img.get_crop(0,y,img.width(),y);
		columna=img.get_crop(x,0,x,img.height());
		
		// limpia el grafico y le renderiza los perfiles de intensidad
		grafico.fill(0);
		grafico.draw_graph(fila, rojo);
		grafico.draw_graph(columna, verde);
		grafico.draw_graph(segmento, azul);
		
		// si ya seleccionamos un segmento dibuja dicha recta
		if(dibujarRecta){
			imgDisplay=img;
			imgDisplay.draw_line(x0, y0, x1, y1, blanco);
			displayImagen.render(imgDisplay);
			displayImagen.paint();
		}
		
		// actualiza la ventana del grafico
		displayGrafico.render(grafico);
		displayGrafico.paint();
	}
	
	return 0;
}

